/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package message;
import java.util.*;
import java.io.*;
import net.*;
import util.*;
import probability.*;
/**
 *
 * @author antonio
 */

/**
 * Class: _MessagePosition_
 * Usage: Class _MessagePositionHandler_ | metodo handle()
 *
 * MessagePosition ha il compito di selezionare i punti candidati per la
 * posizione corrente.
 * Legge la mappa una riga alla volta.
 * Una riga contiene:
 *
 * - 1 - un punto
 * - 2 - i mac visti nella fase di TRAINING nel punto.
 *
 * Si controlla per ogni punto della mappa se i suoi mac coincidono con quelli
 * sniffati da NS e contenuti nel Vector position.
 * I punti col maggior numero di corrispondenze sono selezionati come punti candidati.
 * Si crea un oggetto di tipo _ProbabilityPosition_ che contiene
 *
 * - 1 - il Vector di oggetti AccessPoint, quindi tutti gli AP rilevati da NS
 *       nella posizione corrente con relative info (mac, segnale, num_tot_segnali)
 * - 2 - il Vector region che contiene i punti della mappa selezionati, cioè i
 *       punti con le max occorrenze per i mac rilevati da NS
 *
 * L'oggetto di tipo _ProbabilityPosition_ è inserito in una coda globale che 
 * verrà processata da un Thread (avviato nel main) di tipo _LocatorBayesian_
 *
 * _LocatorBayesian_ ha il compito di calcolare le probabilità condizionate ed
 * elegere il punto che rappresenterà la posizione corrente
 *
 */
public class MessagePosition extends Message implements Runnable{

    private Vector position = new Vector();  //vettore contenente oggetti di tipo
                                            //AccessPoint rappresentanti gli AP
                                           //rilevati da NS con rispettive info
                                          //(nome_mac, segnali, num_tot_segnali)

    public MessagePosition(Vector position)
    {
        this.position = position;

        //creo il thread che fa partire il metodo run di MessagePosition che si 
        //calcola la regione di spazio da selezionare e la inserisce nella coda

        Thread t = new Thread(this);
        t.start();
    }

    public void run()
    {
        boolean response;
        ProbabilityPosition event = this.selectRegionOfSpace();

        do{

        response = QueuePointsPosition.queue.offer(event);  //aggiungo l'elemento nella coda

        }while(response == false);
    }

    private ProbabilityPosition selectRegionOfSpace()
    {
        int numTokens;
        int maxMac = 0;  //numero massimo di mac corrispondenti

        String tmpRegion;  //punto di una linea del file
        Vector region = new Vector(); //punti selezionati

        try{
            File mapRegionsOfSpace = new File("E:\\Documents and Settings\\antonio\\Documenti\\mappa.txt");

            BufferedReader mapFile = new BufferedReader(new FileReader(mapRegionsOfSpace));

            while(true)
            {
                Vector mac = new Vector();  //mac di una linea del file
                String line = mapFile.readLine();
                if(line == null)
                {
                    break;
                }
                else
                {
                    StringTokenizer tokenizer = new StringTokenizer(line, ",=");
                    numTokens = tokenizer.countTokens();
                    for(int i=0; i<(numTokens-1); i++)
                        mac.add(i, tokenizer.nextToken());
                    tmpRegion = tokenizer.nextToken(); //l'ultimo token è il punto

                    int countMacInOneLine = 0;
                    for(int i=0; i<mac.size(); i++)
                    {
                        String tmpMac = (String)mac.elementAt(i);
                        for(int j=0; j<this.position.size(); j++)
                        {
                            AccessPoint tmp = ((AccessPoint)this.position.get(j));
                            String macSniffato = tmp.getMac();
                            if(tmpMac.equals(macSniffato))
                            {
                                countMacInOneLine++;
                                break;
                            }
                        }
                    }

                    if(countMacInOneLine == maxMac) //se ho trovato un punto con occorrenze massime lo aggiungo al vettore dei punti massimi
                    {
                        maxMac = countMacInOneLine;
                        region.add(tmpRegion);
                    }
                    else if(countMacInOneLine > maxMac)
                    {
                        region.removeAllElements(); //se ho trovato un punto con il maggior numero di occorrenze, elimino quelli precedenti
                        maxMac = countMacInOneLine;
                        region.add(tmpRegion);
                    }

                }
            }

        }catch(Exception e)
        {
            e.printStackTrace();
        }

        System.out.println("MAC SNIFFATI\n");
        for(int d=0; d<this.position.size(); d++)
        {
            AccessPoint ap = (AccessPoint)this.position.elementAt(d);
            String mac = ap.getMac();
            System.out.print( "|" + mac + "|");
        }
        System.out.println();

        System.out.println("PUNTI CANDIDATI\n");
        for(int f=0; f<region.size(); f++)
            System.out.println((String)region.elementAt(f));

        System.out.println();
        
        return new ProbabilityPosition(this.position, region);

    }



}
